
private var _connection_server:String = null;
private var _projects:Projects        = new Projects();
private var _callback:Function        = function():void {};
private var _changed_server:Boolean   = false;

public var _currentProjectId:Number;
public var _currentRecode:Object;
public var _editFlg:Boolean;




private function initLogin():void
{
    if (_localSo.data && _localSo.data.connection_server) {
        _serverUrl = _localSo.data.connection_server;
        connection_server.text = _serverUrl;
        if (_localSo.data.user_login_id) {
            user_login_id.text = _localSo.data.user_login_id;
            user_password.setFocus();
        } else {
            user_login_id.setFocus();
        }
    } else {
        connection_server.text = _default_server;
        //connection_server.setFocus();
        user_login_id.setFocus();
    }
}

/**
 * エンターキーが押し下げられたときにユーザフィールドにフォーカスを移動
 */
private function focusToLoginUserId(e:KeyboardEvent):void
{
    if (e.keyCode == Keyboard.ENTER) {
        //stage.focus = user_login_id;
        user_login_id.setFocus();
    }
}

/**
 * エンターキーが押し下げられたときにパスワードフィールドにフォーカスを移動
 */
private function focusToLoginPassword(e:KeyboardEvent):void
{
    if (e.keyCode == Keyboard.ENTER) {
        //stage.focus = user_password;
        user_password.setFocus();
    }
}

/**
 * エンターキーが押し下げられたときにログイン処理を実施する
 */
private function enterToLogin(e:KeyboardEvent):void
{
    if (e.keyCode == Keyboard.ENTER) {
        login();
    }
}



private function login():void
{
    if (user_login_id.text == '' || user_password.text == '') {
        Alert.show("ログインIDとパスワードを入力してください。", "ERROR!", Alert.OK);
    }else {
        var url:String = connection_server.text;
        var exists_database:Boolean = _projects.checkDatabase(_databaseFile, 0);
        if (exists_database) {
            if (_localSo && _localSo.data.connection_server != connection_server.text) {
                _changed_server = true;
                check_server_connection(url, serverLogin);
            } else {
                localLogin();// DBがあればローカルログイン
            }
        } else {
            check_server_connection(url, serverLogin);
        }
    }
}

/**
 * ローカルのデータベースを使用してログインを実施
 * 
 * SharedObjectが存在すれば，そのIDとパスワードを利用してログインを実施．
 * なければサーバ経由でログインを実施
 */
private function localLogin():void
{
    var _login_id:String = user_login_id.text;
    var _password:String = user_password.text;
    // データベース認証
    _projects.connect(_databaseFile);
    var user:Object = _projects.get_user(_login_id);
    var key:String  = "change-me--" + _password + "--"
    var hash:IHash = Crypto.getHash("sha1");
    var result:ByteArray = hash.hash(Hex.toArray(Hex.fromString(key)));
    
    var hashed:String = Hex.fromArray(result);
    if (user && user.password == hashed) {
        _loginId = user.id;
        showProjectCanvas();
    } else {
        // パスワードが変更されている可能性を考慮して可能ならサーバからログインしてみる
        var url:String = _serverUrl;
        check_server_connection(url, serverLogin);
        //Alert.show("ログインできませんでした。", "ERROR!", Alert.OK);
    }
/*
    // SharedObject認証
    if (_localSo.data.user_login_id != null && _localSo.data.user_password != null) {
        if (_localSo.data.user_login_id == user_login_id.text && _localSo.data.user_password == user_password.text) {
            _loginId = _localSo.data.id;
            // プロジェクト一覧に遷移
            showProjectCanvas();
        } else {
            Alert.show("ログインできませんでした。", "ERROR!", Alert.OK);
        }
    } else {
        var params:Object = new Object();
        params.user_login_id = user_login_id.text;
        params.user_password = user_password.text;
        _service = new HTTPService();
        _service.url = _serverUrl + "extensions/air/login";
        _service.method = "POST";
        //_service.addEventListener("result", localLoginResult);
        //_service.addEventListener("fault", localLoginFault);
        _service.send(params);
    }
*/
}


/**
 * サーバを利用してログインを実施．
 */
private function serverLogin():void
{
    var params:Array = new Array();
    params.user_login_id = user_login_id.text;
    params.user_password = user_password.text;
    
    _service = new HTTPService();
    _service.url = _serverUrl + "extensions/air/login";
    _service.method = "POST";
    _service.addEventListener("result", serverLoginResult);
    _service.addEventListener("fault", serverLoginFault);
    _service.send(params);
}

private function serverLoginResult(event:ResultEvent):void
{
    var rawData:String = String(event.result);
    var ret:Object     = JSON.decode(rawData);
    if (ret.success) {
        // SharedObjectを一旦破棄
        _localSo.clear();
        // SharedObjectに情報を格納
        _localSo.setProperty('user_login_id', ret.result.items.user_login_id);
        _localSo.setProperty('user_password', ret.result.items.user_password);
        _localSo.setProperty('user_name', ret.result.items.user_name);
        _localSo.setProperty('id', ret.result.items.id);
        _localSo.setProperty('connection_server', _serverUrl);
        var r:String = _localSo.flush(1000);

        _loginId = _localSo.data.id;
        if (_projects.checkDatabase(_databaseFile, 0) && _changed_server != true) {
            // update password
            _projects.updateUserPassword(ret.result.items.user_login_id, ret.result.items.user_password);
            showProjectCanvas();
        } else{
            if (_changed_server == true) {
                Alert.show("接続先が変更されたためデータベースを初期化します。", "サーバ変更", 3, this, _serverChangedInitDb);
            } else {
                // DB初期化
                initDbJSON();
            }
        }
    } else {
        Alert.show("ログインできませんでした。", "ERROR!", Alert.OK);
    }
}

private function _serverChangedInitDb(event:CloseEvent):void
{
    initDbJSON();// DB初期化
}

/**
 * サーバ経由のログインが失敗したときの処理
 */
public function serverLoginFault(event:FaultEvent):void {
    var faultstring:String = event.fault.faultString;
    Alert.show(faultstring);
    Alert.show("ログインできませんでした。", "ERROR!", Alert.OK);
}


private function check_server_connection(url:String, callback:Function):void
{
    if (url != '') {
        _callback = callback;
        _monitor = new URLMonitor(new URLRequest(url));
        _monitor.addEventListener(StatusEvent.STATUS, checkServer);
        _monitor.start();
    } else {
        Alert.show("接続サーバが指定されていません。", "ERROR!", Alert.OK);
    }
}

/**
 * サーバにアクセス可能かどうかをチェック
 */
private function checkServer(e:StatusEvent):void
{
    if (_monitor.available) {
        _monitor.stop();
        //viewstack1.selectedChild = loginCanvas;// ログイン選択画面を表示
        _serverUrl = connection_server.text;
        _callback();
    } else {
        _monitor.stop();
        Alert.show("ネットワークに接続していません。", "Server Connection", Alert.OK);
    }
}
